package SparkRDD.RDD算子.Actions

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.junit.Test

/*
  1. reduce 和 reduceByKey 的区别？

     * reduce是一个Action操作，reduceByKey是一个Transformation操作
     * 假设一个RDD里面有10000条数据，并且有10个不同的Key
        rdd.reduce      ---> 生成一条结果 , 本质上是对于一整个数据集进行聚合的
        rdd.reduceByKey ---> 生成10条结果 , 本质上是按照 Key 分组，再进行每组的聚合
     * reduce可以应用与所有类型的数据，而reduceByKey只适用于 KV 类型的数据

  2. reduce 是一个Shuffle操作吗？

     * shuffle操作：分为mapper和reducer两端，并且只适用于 KV 类型的数据
                   将数据放入partitioner的函数计算求得分往哪个reducer后，分向对应的reducer
       reduce操作没有mapper和reducer，它作用于RDD中的每一个分区，然后在分区上求得局部结果，最终汇总到Driver中求取最终的结果

     * RDD五大属性之一Partition只有KV类型的数据才有，并且在shuffle操作过程中使用

 */
class reduceTest {

  val conf = new SparkConf().setMaster("local[6]").setAppName("sortBy")
  val sc   = new SparkContext(conf)

  @Test
  def reduceTest: Unit ={
    val rdd: RDD[(String, Double)] = sc.parallelize(Seq(("薯片",8.0),("可乐",3.0),("面包",4.5)))
    val result: (String, Double) = rdd.reduce((curr, agg) => ("总价",curr._2+agg._2))
    println(result)
  }
}
